/*
 * 可执行程序一：
 * 父进程负责创建子进程并且最后回收其资源；
 * 子进程加载可执行程序二。

 * 可执行程序二：
 * 列出当前目录所有文件的文件名。
*/

#include <my_header.h>

int main(int argc, char *argv[]){
    if(fork() == 0){ // 子进程
        // 获取当前工作目录
        char curDirName[50] = {0}; 
        char *ret = getcwd(curDirName, sizeof(curDirName));
        ERROR_CHECK(ret, NULL, "getcwd");

        // 打开当前工作目录
        DIR *dir = opendir(curDirName);
        ERROR_CHECK(dir, NULL, "opendir");

        // 遍历目录流读取目录项，打印当前目录下的所有文件名
        struct dirent *entry; // 目录项
        while((entry = readdir(dir)) != NULL){
            printf("%s\n", entry->d_name);
        }

        // 关闭目录流
        closedir(dir);
    }
    else{ // 父进程
        int status; // 保存子进程退出状态
        int c_pid = wait(&status); // 等待子进程结束并回收其资源
        if(WIFEXITED(status) && WEXITSTATUS(status) == 0){
            printf("\nParent process ends.\n");
            
        }
        else{ // 子进程异常退出
            printf("\nChild process (pid=%d) failed.\n", c_pid);
        }
    }

    return 0;
}